<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>84_修改原型</title>
		<script>
			/* 
			大部分情况下，我们是不需要修改原型对象。
			注意:
				千万不要通过类的实例去修改原型
				1.通过一个对象影响所有同类对象，这么做不合适
				2.修改原型先得创建实例，麻烦
				3.危险
				
			处理通过__proto__能访问对象的原型外，
				还可以通过类的prototype属性，来访问实例的原型。
				
				修改原型时，最好通过通过类去修改；
				
				好处:
					1.一修改就是修改所有实例的原型
					2.无需创建实例即可完成对类的修改
					
				修改原型原则:
					1.原型尽量不要手动改
					2.要改也不要通过实例对象去改
					3.通过 类.prototype属性去修改
					4，最好不要直接给prototype去赋值
			 */
			class Person {
				name = "孙悟空";
				age = 18;
				fn = () => {}
				sayHello() {
					console.log("...", this.name);
				}
			}

			class Dog {

			}

			const p = new Person();
			const p2 = new Person();

			//修改了它person的原型。
			//通过对象修改原型，向原型中添加方法，修改后所有同类实例都能访问该方法。
			p.__proto__.run = () => {
				console.log("我在跑....");
			}

			//直接为对象赋值了一个新的原型,旧原型的东西将没有了。不要这么做
			//p.__proto__ = new Dog();
			//p.run(); //会报错，修改了原型后，原来向原型中添加的run方法就不存在。

			p2.run();

			console.log(Person.prototype) //访问Person实例的原型对象

			//等于我把fly方法添加到原型里。谁的原型？
			//注意：是Person实例的原型，比如p，p1的原型。
			Person.prototype.fly = () => {
				console.log("我在飞!");
			}
			p.fly();
			p2.fly()
		</script>
	</head>
	<body>
	</body>
</html>